#ifndef CICORE_SIZE_H
#define CICORE_SIZE_H

#include <cmath>

namespace CICore {
    class Size {    

    public:        
        Size (const float x=0, const float y=0, const float z=0);        //Constructor
        virtual ~Size ();                                                //Destructor

        float x, y, z;      //Size's dimension                    
    };    

    //Basic size's unary operations
    Size& operator ++ (Size& v, int);               //Postfix increment
    Size& operator ++ (Size& v);                    //Prefix increment

    Size& operator -- (Size& v, int);               //Postfix decrement
    Size& operator -- (Size& v);                    //Prefix increment

    //Basic size's binary operations
    Size operator + (const Size& a, const Size& b);     //Sum between two sizes
    Size& operator += (Size& a, const Size& b);         //Assignment by addition between two sizes

    Size operator - (const Size& a, const Size& b);     //Difference between two sizes
    Size& operator -= (Size& a, const Size& b);         //Assignment by substraction between two sizes

    Size operator * (const Size& a, const Size& b);     //Product between two sizes
    Size& operator *= (Size& a, const Size& b);         //Assignment by multiplication between two sizes

    Size operator / (const Size& a, const Size& b);     //Quotient between two sizes
    Size& operator /= (Size& a, const Size& b);         //Assignment by division between two sizes

    Size operator + (const Size& a, const float b);     //Sum between a size and a float value
    Size& operator += (Size& a, const float b);         //Assignment by addition between a size and a float value

    Size operator - (const Size& a, const float b);     //Difference between a size and a float value
    Size& operator -= (Size& a, const float b);         //Assignment by substraction between a size and a float value

    Size operator * (const Size& a, const float b);     //Product between a size and a float value
    Size& operator *= (Size& a, const float b);         //Assignment by multiplication between a size and a float value

    Size operator / (const Size& a, const float b);     //Quotient between a size and a float value
    Size& operator /= (Size& a, const float b);         //Assignment by division between a size and a float value


}
#endif /* CICORE_SIZE_H */
